#include "ConexionCliente.h"
#include "../../SDLtoolkit/Asteroide.h"
#include "../DTOCliente.h"
#include "../DTOFinHandshake.h"

ConexionCliente::ConexionCliente(std::string id,std::string host,SpaceBattleInterface* game,SocketProtocoloPlano* socket,ColaMensajes* enviar,ColaMensajes* recibir,const bool* conexionActiva){
	this->id = id;
	this->conexionAServer = NULL;

	//Hago el handshake
	this->handshake(id,host,game,socket,enviar,recibir,conexionActiva);
}


std::string ConexionCliente::getId(){
	return id;
}

void ConexionCliente::handshake(std::string id,std::string host,SpaceBattleInterface* game,SocketProtocoloPlano* socket,ColaMensajes* enviar,ColaMensajes* recibir,const bool* conexionActiva){
	ColaMensajes* mensajesHandshake = new ColaMensajes(id);
	ConexionBidireccional* conexion = new ConexionBidireccional(host,socket,mensajesHandshake);

	DTO* dto = conexion->recibir();

	//Recibo los asteroides
	std::list<DTOAsteroide*> listDTOAsteroides;
	while(dto->getType() == ASTEROIDE){
		DTOAsteroide* dtoAsteroide = (DTOAsteroide*)dto;
		listDTOAsteroides.push_back(dtoAsteroide);
		dto = conexion->recibir();
	}

	game->setAsteroides(listDTOAsteroides);

	DTOFinHandshake* finHandshake = (DTOFinHandshake*)dto;

	//Pass the information of the dimension of the play scenario in the server.
	game->setPlayScenarioDimensions(finHandshake->getWidth(),finHandshake->getHeight());


	DTOShipStatus* shipStatus = game->getShip()->transformInDTO();
	conexion->enviar(new DTOCliente(this->id,CONNECTED,shipStatus));

	DTOCliente* fin =(DTOCliente*)conexion->recibir();

	conexion->terminar();
	delete conexion;
	delete mensajesHandshake;

	if (fin->getOwner() == this->id && fin->getStatus() == CONNECTED) {

		conexionAServer = new ConexionBidireccional(host,socket,finHandshake->getListenPort(),finHandshake->getBroadcastPort(),recibir,enviar);
		conectado = true;
	}else{
		conectado = false;
		Logger::log("ConexionCliente","handshake","Error interno!");
	}

}

bool ConexionCliente::esValida(){
	return this->conexionAServer->estaConectado();
}


ConexionCliente::~ConexionCliente(){
	delete conexionAServer;
}

void ConexionCliente::terminar(){
	this->conexionAServer->terminar();
}

bool ConexionCliente::getConnected(){
	return conectado;
}
